/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.modelo;

import br.com.foxinline.enums.Sexo;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Size;
import org.hibernate.validator.constraints.NotBlank;

/**
 *
 * @author laverson
 */
@Entity
public class Usuario implements Serializable{
    @Id
    @SequenceGenerator(name = "seq_usuario", sequenceName = "seq_usuario", allocationSize = 1)
    @GeneratedValue(generator = "seq_usuario", strategy = GenerationType.SEQUENCE)
    private Long id;

    @Column(length=60)
    @NotBlank
    @NotNull
    @Size(max=60, message="Cargo deve ter no máximo 60 caracteres.")    
    private String cargo;

    @Column(length=120)
    @NotBlank
    @NotNull
    @Size(max=120, message="Nome deve ter no máximo 120 caracteres.")    
    private String nome;
    
    @Column(length = 20)
    private String rg;
    
    @Column(length = 11)
    private String cpf;
    
    @OneToOne(cascade=CascadeType.ALL)
    private Telefone telefone;

    @Column(length = 20, unique = true)
    @NotNull(message = "Campo login é obrigatório")
    private String login;
    
    @Column(length = 32, columnDefinition = "varchar")
    @NotNull(message = "Campo Senha é obrigatório")
    private String senha;
    
    private boolean status = true;
    
    @Column(length = 60)
    private String email;
        
    @Enumerated(EnumType.STRING)
    private Sexo sexo;
    
    @Temporal(TemporalType.DATE)
    private Date datacadastro;
    
    @ManyToMany(cascade=CascadeType.ALL, fetch = FetchType.LAZY)
    private List<Grupo> grupos;
    
    @ManyToMany(fetch = FetchType.LAZY)
    private List<Secao> secao;
    
    @OneToOne
    private Cartorio cartorio;

    public Usuario() {}

    public Usuario(Long id, String cargo, String nome, String rg, String cpf, Telefone telefone, String login, String senha, boolean status, String email, Sexo sexo, Date datacadastro, List<Grupo> grupos, List<Secao> secao, Cartorio cartorio) {
        this.id = id;
        this.cargo = cargo;
        this.nome = nome;
        this.rg = rg;
        this.cpf = cpf;
        this.telefone = telefone;
        this.login = login;
        this.senha = senha;
        this.status = status;
        this.email = email;
        this.sexo = sexo;
        this.datacadastro = datacadastro;
        this.grupos = grupos;
        this.secao = secao;
        this.cartorio = cartorio;
    }
    
    public String getCargo() {
        return cargo;
    }

    public void setCargo(String cargo) {
        this.cargo = cargo;
    }

    public Cartorio getCartorio() {
        return cartorio;
    }

    public void setCartorio(Cartorio cartorio) {
        this.cartorio = cartorio;
    }

    public Telefone getTelefone() {
        return telefone;
    }

    public void setTelefone(Telefone telefone) {
        this.telefone = telefone;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public Date getDatacadastro() {
        return datacadastro;
    }

    public void setDatacadastro(Date datacadastro) {
        this.datacadastro = datacadastro;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public List<Grupo> getGrupos() {
        return grupos;
    }

    public void setGrupos(List<Grupo> grupos) {
        this.grupos = grupos;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getRg() {
        return rg;
    }

    public void setRg(String rg) {
        this.rg = rg;
    }

    public List<Secao> getSecao() {
        return secao;
    }

    public void setSecao(List<Secao> secao) {
        this.secao = secao;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public Sexo getSexo() {
        return sexo;
    }

    public void setSexo(Sexo sexo) {
        this.sexo = sexo;
    }

    public boolean isStatus() {
        return status;
    }

    public void setStatus(boolean status) {
        this.status = status;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Usuario other = (Usuario) obj;
        if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {
            return false;
        }
        if ((this.cargo == null) ? (other.cargo != null) : !this.cargo.equals(other.cargo)) {
            return false;
        }
        if ((this.nome == null) ? (other.nome != null) : !this.nome.equals(other.nome)) {
            return false;
        }
        if ((this.rg == null) ? (other.rg != null) : !this.rg.equals(other.rg)) {
            return false;
        }
        if ((this.cpf == null) ? (other.cpf != null) : !this.cpf.equals(other.cpf)) {
            return false;
        }
        if (this.telefone != other.telefone && (this.telefone == null || !this.telefone.equals(other.telefone))) {
            return false;
        }
        if ((this.login == null) ? (other.login != null) : !this.login.equals(other.login)) {
            return false;
        }
        if ((this.senha == null) ? (other.senha != null) : !this.senha.equals(other.senha)) {
            return false;
        }
        if (this.status != other.status) {
            return false;
        }
        if ((this.email == null) ? (other.email != null) : !this.email.equals(other.email)) {
            return false;
        }
        if (this.sexo != other.sexo) {
            return false;
        }
        if (this.datacadastro != other.datacadastro && (this.datacadastro == null || !this.datacadastro.equals(other.datacadastro))) {
            return false;
        }
        if (this.secao != other.secao && (this.secao == null || !this.secao.equals(other.secao))) {
            return false;
        }
        if (this.cartorio != other.cartorio && (this.cartorio == null || !this.cartorio.equals(other.cartorio))) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 71 * hash + (this.id != null ? this.id.hashCode() : 0);
        hash = 71 * hash + (this.cargo != null ? this.cargo.hashCode() : 0);
        hash = 71 * hash + (this.nome != null ? this.nome.hashCode() : 0);
        hash = 71 * hash + (this.rg != null ? this.rg.hashCode() : 0);
        hash = 71 * hash + (this.cpf != null ? this.cpf.hashCode() : 0);
        hash = 71 * hash + (this.telefone != null ? this.telefone.hashCode() : 0);
        hash = 71 * hash + (this.login != null ? this.login.hashCode() : 0);
        hash = 71 * hash + (this.senha != null ? this.senha.hashCode() : 0);
        hash = 71 * hash + (this.status ? 1 : 0);
        hash = 71 * hash + (this.email != null ? this.email.hashCode() : 0);
        hash = 71 * hash + (this.sexo != null ? this.sexo.hashCode() : 0);
        hash = 71 * hash + (this.datacadastro != null ? this.datacadastro.hashCode() : 0);
        hash = 71 * hash + (this.secao != null ? this.secao.hashCode() : 0);
        hash = 71 * hash + (this.cartorio != null ? this.cartorio.hashCode() : 0);
        return hash;
    }

    
}
